#include <iostream>
#include <sstream>

namespace eniac
{

class r_logger
{
public:
    r_logger(const r_logger&) = delete;
    r_logger(r_logger&&) = delete;
    r_logger& operator=(const r_logger&) = delete;
    r_logger& operator=(r_logger&&) = delete;

    r_logger(){};
    ~r_logger(){
        std::cout << m_ss.str() << std::endl;
    };

    template<typename T>
    r_logger& operator<<(const T& value)
    {
        m_ss << value;
        return *this;
    }

private:
    std::ostringstream m_ss {};
};

#define LOG_DBG() r_logger()
#define LOG_INF() r_logger()
#define LOG_ERR() r_logger()
#define LOG_WRN() r_logger()

}